package scala.test_feature.test_for

/**
 * @author 黄海峰 2021/4/19 14:46
 * */
object DeanTest {
  def main(args: Array[String]): Unit = {
    val userList = List(User("dean", 28), User("lucy", 18))
    val twentySomething = for (user <- userList if (user.age >= 1 && user.age < 30))
    // add this to a list
      yield user.name
    twentySomething.foreach(name => println(name))


    // 二维数组
    foo(10, 10) foreach {
      case (i, j) => println(s"($i,$j)")
    }
    println("==============")

    foo2(10, 10)
  }

  def foo(n: Int, v: Int): IndexedSeq[(Int, Int)] = for (i <- 0 until n; j <- i until n if i + j == v)
    yield (i, j)

  def foo2(n: Int, v: Int): Unit = for (i <- 0 until n; j <- i until n if i + j == v)
    println(s"($i,$j)")
}

/**
 * for(enumerators) yield e
 * scala提供的一种轻量级的标记方式用来表示序列推导。
 * 推导使用的是上面的语法
 * enumerators指一组以分号分隔的枚举器。一个enumerators要么是一个产生新变量的生成器，要么是一个过滤器。
 * for表达式在枚举器产生的每一次绑定中都会计算e值，并在循环借宿后返回这些值组成的新的序列。
 *
 * yield user.name 实际上是一个  List[String]
 *
 * user <- userList 是一个生成器
 *
 * if (user.age >= 1 && user.age < 30) 是一个过滤器
 *
 *
 */